package com.file.system.entity.res;

import java.io.Serializable;

/**
 * 消息返回类
 *
 * @param <T>
 * @Author jch
 */
public class CommonResult<T> extends BaseResult implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 构造方法
     */
    public CommonResult() {

    }

    /**
     * 自定义返回消息success、message
     *
     * @param success 成功or失败
     * @param message 消息
     */
    public CommonResult(boolean success, String message) {
        this.setSuccess(success);
        this.setMessage(message);
    }

    /**
     * 自定义返回消息success
     *
     * @param success 成功or失败
     */
    public CommonResult(boolean success) {
        this.setSuccess(success);
    }

    /**
     * 自定义返回消息code、message
     *
     * @param code    自定义返回编码
     * @param message 消息
     */
    public CommonResult(int code, String message) {
        this.setCode(code);
        this.setMessage(message);
    }

    /**
     * 自定义返回消息success、message、data
     *
     * @param success 成功or失败
     * @param message 消息
     * @param data    返回数据
     */
    public CommonResult(boolean success, String message, T data) {
        this.setSuccess(success);
        this.setMessage(message);
        this.setData(data);
    }


    /**
     * 调用成功
     *
     * @return
     */
    public static CommonResult ok() {
        return ok(BaseCode.Common.SUCCESS);
    }

    /**
     * 调用成功、有异常
     *
     * @param msg
     * @return
     */
    public static <T> CommonResult<T> ok(BaseCode.Common msg) {
        return baseCreate(msg.getCode(), msg.getMessage(), true);
    }

    /**
     * 调用失败
     *
     * @return
     */
    public static CommonResult fail() {
        return fail(BaseCode.Common.ERROR);
    }

    /**
     * 调用失败  传入失败类型
     *
     * @return
     */
    public static CommonResult fail(BaseCode.Common msg) {
        return baseCreate(msg.getCode(), msg.getMessage(), false);
    }

    /**
     * 调用失败message
     *
     * @param message 传入配置消息
     * @return
     */
    public static CommonResult fail(IMessage message) {
        return fail(message.getCode(), message.getMessage());
    }

    /**
     * 调用失败code、msg
     *
     * @param code 编码
     * @param msg  消息
     * @return
     */
    public static CommonResult fail(int code, String msg) {
        return baseCreate(code, msg, false);
    }

    /**
     * 自定义返回消息
     *
     * @param state 添加或修改状态
     */
    public static CommonResult check(boolean state) {
        BaseCode.Common common = state ? BaseCode.Common.SUCCESS : BaseCode.Common.ERROR;
        return baseCreate(common.getCode(), common.getMessage(), state);
    }

    /**
     * 基本方法
     *
     * @param code    编码
     * @param msg     消息
     * @param success 成功or失败
     * @return
     */
    private static <T> CommonResult<T> baseCreate(int code, String msg, boolean success) {
        CommonResult result = new CommonResult();
        result.setCode(code);
        result.setSuccess(success);
        result.setMessage(msg);
        result.setTimestamp(System.currentTimeMillis());
        return result;
    }

    /**
     * 设置数据
     *
     * @param data 数据
     * @return
     */
    public CommonResult<T> setResult(T data) {
        this.setData(data);
        return this;
    }

    /**
     * 设置数据
     *
     * @param msg 信息
     * @return
     */
    public CommonResult<T> setText(String msg) {
        this.setMessage(msg);
        return this;
    }

    /**
     * 获取数据
     *
     * @return
     */
    public T getData() {
        return (T) super.getData();
    }
}